(require 'srfi-1)
(define cria-personagem
  (lambda (nome
      descricao
      sala-atual
      objetos)
    (let ((self-nome nome)
          (self-descricao descricao)
          (self-sala-atual sala-atual)
          (self-objetos objetos))
      (lambda (selector)

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        (cond ((eq? selector 'get-nome)
               (lambda ()
                 self-nome))

              ((eq? selector 'set-nome)
               (lambda (novo-nome)
                 (set! self-nome novo-nome)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-descricao)
               (lambda ()
                 self-descricao))

              ((eq? selector 'set-descricao)
               (lambda (nova-descricao)
                 (set! self-descricao nova-descricao)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-sala-atual)
               (lambda ()
                 self-sala-atual))

              ((eq? selector 'set-sala-atual)
               (lambda (nova-sala)
                 (set! self-sala-atual nova-sala)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'get-objetos)
               (lambda ()
                 self-objetos))

              ((eq? selector 'set-objetos)
               (lambda (novos-objetos)
                 (set! self-objetos novos-objetos)))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;
              ((eq? selector 'tem-objeto?)
               (lambda (objeto)
                 (if (memq objeto self-objetos) #t #f)))

              ((eq? selector 'add-objeto)
               (lambda (objeto)
                 (set! self-objetos (append! self-objetos `(,objeto)))))

              ((eq? selector 'del-objeto)
               (lambda (objeto)
                 (set! self-objetos (delete! objeto self-objetos))))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;
	      ((eq? selector 'olhar-sala)
	       (lambda ()
		 ((self-sala-atual 'get-descricao))))

	      ((eq? selector 'olhar-personagem)
	       (lambda (personagem)
		 ((personagem 'get-descricao))))

	      ((eq? selector 'olhar-objeto)
	       (lambda (objeto)
		 (if (null? self-objetos)
		     (print "Não existem objetos a serem olhados")
		     ((objeto 'get-descricao)))))
	      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	      
              (else
               #f))))))
